package com.such.kit.jna.bean;

import org.xvolks.jnative.Type;
import com.such.kit.string.StringCommons;

/**
 * @author SUCH <pre>
 * JNative 实现的参数
 * </pre>
 */
public class JNativeArg {

	/** IO_TYPE_IN：入参 */
	public static final String IO_TYPE_IN = "in";
	/** IO_TYPE_OUT：出参 */
	public static final String IO_TYPE_OUT = "out";

	/** ioType：入参或者出参，出参只能有一个 */
	private String ioType;
	/** type：JNative 内置的 {@link Type 参数类型}，其中 PSTRUCT 已被 JNative 弃用，在此作为指针处理 */
	private Type type;
	/** value：参数值 */
	private String value;
	/**
	 * valueSize：指定参数值的最大长度 <pre>
	 * 一般情况下会系统会自动计算 value 的长度
	 * 
	 * 当出参为指针时，需要额外指定 valueSize，此时的 valueSize 为出参所占用的内存大小 [默认值为 1024 * 1024]
	 * </pre>
	 */
	private int valueSize = 1024 * 1024;

	/**
	 * <pre>
	 * ioType 默认为 {@link #IO_TYPE_OUT}
	 * </pre>
	 * @param type 参数类型 [参考 {@link #type}]
	 */
	public JNativeArg(Type type) {
		this.ioType = IO_TYPE_OUT;
		this.type = type;
	}

	/**
	 * <pre>
	 * ioType 默认为 {@link #IO_TYPE_IN}
	 * </pre>
	 * @param type 参数类型 [参考 {@link #type}]
	 * @param value 参数值
	 */
	public JNativeArg(Type type, String value) {
		this.ioType = IO_TYPE_IN;
		this.type = type;
		this.value = value;
		// 使用 UTF-8 编码进行计算，方块字 UTF-8 编码占用 3 位，比 GBK 多 1 位，理论上在指针模式下可以保证内存块够用
		this.valueSize = StringCommons.length(value, StringCommons.CHARSET_UTF8, true);
	}

	/** [参考 {@link #ioType}] */
	public String getIOType() {
		return this.ioType;
	}

	/** [参考 {@link #ioType}] */
	public void setIOType(String ioType) {
		this.ioType = ioType;
	}

	/** [参考 {@link #type}] */
	public Type getType() {
		return this.type;
	}

	/** [参考 {@link #type}] */
	public void setType(Type type) {
		this.type = type;
	}

	/** [参考 {@link #value}] */
	public String getValue() {
		return this.value;
	}

	/** [参考 {@link #value}] */
	public void setValue(String value) {
		this.value = value;
	}

	/** [参考 {@link #valueSize}] */
	public int getValueSize() {
		return this.valueSize;
	}

	/** [参考 {@link #valueSize}] */
	public void setValueSize(int valueSize) {
		this.valueSize = valueSize;
	}

}
